CityEngine では、プロシージャルという技術を使用して、都市をモデリングします。プロシージャル モデリングを行うには、CGA スクリプトを書いてルールを定義する必要があります。
ルールとは、モデルをどのように構築するかを記述した設計図です。そして、そのルールを書きこむのが、CGA スクリプト (ルール ファイル) という一連の処理 (コマンド) を記述したスクリプトです。
CGA スクリプトを作成して、実際にルールをどのように設定していくかを紹介します。
演習 |
---|
・準備 |
・CGA スクリプトの記述 |
・属性 |
・基本的なオペレーション |
・今回作成した CGA |
プロジェクトの作成から続けて行う場合は、ステップ 1、2 はスキップしてください。
[スタート] → [すべてのプログラム] → [ArcGIS] → [CityEngine 202x.x] をクリックし、CityEngine を起動します。
Navigator ウィンドウで、前章で作成したプロジェクトの Scene フォルダーを開き、保存したシーン ファイル (MyScene1.cej) をダブルクリックして開きます。
Scene ウィンドウ → [New Shapes] のチェックボックスをオフにして、前章で作成したシェープを非表示にします。また、Streetnetwork レイヤーを展開し、Blocks レイヤーのチェックをオンにして表示します。
これで準備が整いました。
新規ルール ファイルを作成します。[File] メニュー → [New] → [Select a wizard] ダイアログで、[CityEngine] フォルダー → [CGA Rule File] を選択して、[Next] をクリックします。
[CGA Rule File] で、フォルダーの格納先を選択し、[File name] に「House_rule.cga」と名前を付けて、[Finish] をクリックします。
Navigator ウィンドウ → プロジェクト → [rules] フォルダー → [House_rule.cga] をダブルクリックします。
画面の左下のウィンドウに [House_rule.cga] ルール ウィンドウが開きます。ウィンドウの右端をつまんで少し右にドラッグしてウィンドウを広げると見やすくなります。
(ルール ウィンドウ内の右上の [Maximize] ボタンをクリックすれば、ウィンドウを最大表示にすることができます。)
ルール ウィンドウにある [House_rule.cga] の中で、以下のように記述します。 これは「Footprint」というルールの定義です。このルールの中では、extrude() という面を立ち上げる操作 (これを「オペレーション」と呼びます) を行い、その結果生成した図形を次の「House」というルールに送ります。 オペレーションは一般的なプログラミング言語の関数のように引数をとることができます。この場合は 10m 立ち上げる、という操作です。「#」は、これより右に書かれた文字列を無視する記号 (コメント アウト) です。
Footprint-->
extrude(10) #10m 立ち上げるオペレーション
House #次のルール
ルールを記述すると、下図のようになります。
ルールを定義したら、[File] メニュー → [Save] をクリックして (またはキーボードの Ctrl + S)、ルール ファイルを保存します。
オペレーションの使い方など CGA についての詳細はオンライン ヘルプに記載されています。
各オペレーションをクリックし、その特徴や使用方法を確認します。今回は [extrude] (立ち上げ)、[comp] (シェープの要素分割)、[roofGable] (切妻型の屋根)、[color] (色の変更) オペレーションを使用しますので、確認してみましょう。
[Select] (選択) ツールを選択し、3D View ウィンドウで、[Ctrl] キーを押しながらクリックして区画をいくつか選択します。
Inspector ウィンドウの [Shapes] タブ → [Rules] → [Rule file] で、[Assign] ボタンをクリックし、保存した ルール ファイルを参照します。このルール ファイルがモデル生成時に使用されます。
[Start rule] で、[Select] ボタンをクリックし、[Footprint] を選択します。スタート ルールとは、ルール ファイルの中でも実行される最初のルールを定義しています。今回はフットプリント (2 次元の建物形状) から作成していくので、Footprint ルールをスタート地点として選択します。
ツールバーの [Generate] ボタンをクリックすると、ルール ファイルで定義した家モデルが生成されます。また、区画上に CGA ルール ファイルをドラッグ & ドロップすることでもモデルを生成することができます。
CityEngine の特徴は何と言ってもプロシージャルによるモデリングです。プロシージャル モデリングでは、モデルの様々な要素を変数化することで、無数のバリエーションを瞬時に生成することができます。
また生成した後でも、この変数を変更して動的に形状を変えることができます。この変数を「属性 (Attribute)」と呼びます。
CGA を以下のように書き換え、上書き保存 (Ctrl + S) します。この “Height” が属性です。
attr Height = 10
Footprint-->
extrude(Height)
House
先ほどと同じ 3 つの区画を選択して再度 [Generate] (Ctrl + G) します。
Inspector に Height という項目が出ているはずです (出ていない場合は、3D View ウィンドウ上のモデル以外の場所をクリックして選択を解除後、生成されたモデルをクリックして選択し直すことで Inspector が更新されます)。この数値を [30] などの値に変更してみましょう。
ドロップダウン リストから [Rule default] を選択し、変更をリセットします。
最初の行を以下のようにランダム関数を使って書き換え、上書き保存、モデルを再生成 (Generate) します。
attr Height = rand(5,20)
Height の値がランダム関数で定義した高さに設定されていることを確認してください。
[Update Seed] (モデル更新) ボタンを何度かクリックして、ランダム関数で定義しておいた高さがランダムに変化するのを確認してください。
先ほど書いた CGA の末尾に「House」ルールを追加します。
comp(f) は現在の立体図形 (シェープ) から面の要素を抽出するオペレーションです。抽出した要素をそれぞれ「Roof」と「Wall」というルールに渡して屋根と壁を作ります。color() は色を付けるオペレーション、roofGable() は切妻屋根を作成するオペレーションです。
House-->
comp(f){top: Roof | side: Wall} #シェープをトップ (屋根) とサイド (壁) に分割
Roof-->
roofGable(20,1,1) #Gable (切妻型) の屋根を設定
color(roofcolor)
Wall-->
color(wallcolor)
また、先頭の attr Height・・・の行の下に以下の 4 行を追加します。
@Color
attr roofcolor = listRandom("#ff7f50;#9acd32;#ff4500")
@Color
attr wallcolor = listRandom("#ffff00;#00ffff;#dda0dd")
これらは、屋根と壁をそれぞれ 3 つの色からランダムに選択して属性値とする、という記述です。色の記述に関しては、任意の検索サイトで「HTML カラーコード」で検索して調べてください。 「@Color」は、この下の属性に対して Inspector 上で色の選択ができる GUI を利用可能にします。このように、属性に付与して Inspector 上での振る舞いを定義する「@」で始まる文字列のことを「アノテーション」と呼びます。
アノテーションの種類とそれぞれの詳細については、CGA Annotations をご参照ください。
これまでと同様、上書き保存してモデルを再生成します。
※すでにルールが適用されている区画のみを再選択するには、モデルを 1 つ選択して、右クリック → [Select Objects with Same Rule File] を選択すると簡単です。
[Update Seed] (モデル更新) ボタンを何度かクリックして、ランダム関数で定義しておいた色がランダムに変化するのを確認してください。
最後に、Inspector ウィンドウを開き、CGA スクリプトで設定した [Height]、[roofcolor]、[wallcolor] の属性を変更してみましょう。
例: [Height] パラメーターの値を デフォルトから 20 m に変更し、[roofcolor] と [wallcolor] を変更
このように、単純なルールを幾つもつなぎ合わせて行くことで、より複雑なモデルを構築していくことができ、また属性の設定により、モデル生成後も自由に形状や色を変えることができるのです。
高度な CGAでは、もう少し高度な CGA を使用して、より現実に即した街並みにします。
attr Height = rand(5,20)
@Color
attr roofcolor = listRandom("#ff7f50;#9acd32;#ff4500")
@Color
attr wallcolor = listRandom("#ffff00;#00ffff;#dda0dd")
Footprint -->
extrude (Height)
House
House-->
comp(f){top: Roof | side: Wall} #シェープをトップ(屋根)とサイド(壁)に分割
Roof-->
roofGable(20,1,1) #Gable(切妻型)の屋根を設定
color(roofcolor)
Wall-->
color(wallcolor)